해당 페이지는 모바일 해킹에 필요한 CS지식을 전달하기 위하여 제작되었습니다.
1. 안드로이드 필수 지식
1.1 안드로이드 4대 컴포넌트
"안드로이드 컴포넌트"
는 안드로이드 애플리케이션의 구성 요소를 말합니다. 안드로이드 애플리케이션은 다양한 컴포넌트로 구성되어 있으며, 각 컴포넌트는 특정한 역할을 수행합니다. 주요한 안드로이드 컴포넌트에는 다음과 같은 것들이 있습니다Activity (visual)
- 사용자와 상호작용하기 위한 컴포넌트입니다.
- 전화번호를 표시하거나, 날짜를 표시하거나, 이메일을 작성하는 등 사용자 인터페이스를 포함한 화면 하나를 나타냅니다.
Service
- 백그라운드에서 앱을 지속적으로 실행하기 위한 컴포넌트 입니다.
- 사용자가 앱을 백그라운드로 보낼 경우 백그라운드에서 음악을 재생하거나, 네트워크를 통해 데이터를 가져올 수 있습니다.
Content Provider
- 안드로이드 시스템은 기본적으로 어플리케이션
내부 DB에 대해 해당 어플리케이션만 접근이 가능합니다.
- 하지만 다른 어플리케이션에서도 DB에 접근할 수 있도록 컨텐트 프로바이더 컴포넌트(클래스)를 제공합니다.
- 만약 컨텐트 프로바이더에서 수정, 삭제를 허용할 경우 수정, 삭제도 가능합니다.
- 쉽게 말하면 다른 앱에 저장되어 있는 데이터를 가져올 수 있도록 허용하는 보증서 같은 것이라고 생각하면 됩니다.
BroadcastReceiver
- 브로드캐스트를 받기 위한 컴포넌트
- 시스템이 정기적인 사용자 행위 밖에서 이벤트를 앱에 전달하도록 지원하는 컴포넌트
- 쉽게 말하면 화면 꺼짐, 사진 캡쳐 등 시스템 혹은 다른 앱에서 발생하는 브로드캐스트를 받는 컴포넌트라고 생각하면 됩니다.
1.2 안드로이드에서 데이터가 저장되는 주요 장소
DATA STORAGE
항목 | 설명 |
Shared Preferences | 원시 데이터를 저장하는 XML파일로 /data/data/pakage/~ 항목에 존재한다. |
내부 저장소 | 안드로이드 플랫폼, 시스템 도구, 앱, 그리고 앱에서 사용하는 데이터가 저장되는 공간이다. 각 앱은 자신의 패키지 이름과 일치하는 디렉터리를 생성하여 해당 디렉터리 안의 파일을 읽고 쓸 수 있다. |
외부 저장소 | 앱 간의 데이터 공유가 가능하며, 저장되는 파일들은 어디서든 읽고 쓰기가 가능하다. 각 어플리케이션은 WRITE_EXTERNAL_STORAGE 권한을 가지고 있다면 데이터를 읽고, 쓸 수 있다. |
SQLite DB | 안드로이드에서 사용하는 로컬 DB로, 파일은 /data/data/패키지/databases/ 경로에 생성된다. 주로 서버와 통신하지 않는 앱을 만들 경우. SQLite를 사용하여 데이터를 임시로 저장한다. |
Netwrok Connection | 네트워크로 데이터를 저장하거나, 불러오는 방법으로 SQLite 데이터베이스와 간단한 텍스트 파일 등을 보낼 수 있다. |
1.3 주요 파일 디렉터리
디렉터리 | 설명 |
/ | root 디렉터리, 부트와 관련된 설정들을 참고한 초기 프로세스 정보가 포함됨 |
/system | 안드로이드 OS의 읽기 권한만 가지고 있는 홈 디렉터리이다. 데몬과 관련된 실행파일, 폰트,미디어, 시스템 앱등이 존재한다. |
/data | 사용자 앱들과 상태정보들이 포함된 파일 시스템 디렉터리이다. |
/cache | 쓰기 읽기 권한이 있고, 브라우저 캐시와 같이 일시적인 사용자의 상태를 포함한다. |
/system/app/*.apk | 시스템 앱들의 공간이다. 최적화된 dex코드는 해당 디렉터리에 *.odex 로 저장된다. |
/data/app/*.apk | 미리 등록되는 사용자 앱들의 공간이다. |
/data/app/pakage/1.apk | 사용자가 다운로드한 앱들의 공간이다. 최적화된 dex 코드는 apk@classes.dex로 저장된다. |
2. 안드로이드 동작 원리
2.1 안드로이드 구조
2.2 ART, Dalbik
2.3 dex, smali
3. ADB
3.1 ADB에 대한 설명
ADB란 Android Debug Bridge로 에뮬레이터나 PC에 실제로 연결된 장치를 제어하기 위한
안드로이드 디버깅 도구
입니다. 안드로이드 스튜디오에서는 해당 기능을 GUI로 제공하지만, ADB는 CLI를 통해 명령어를 입력하여 제어합니다. ADB는 안드로이드 SDK에 포함되어 있기 때문에 SDK가 설치되어 있다면 사용할 수 있습니다.3.2 ADB의 구성 요소
클라이언트
안드로이드 개발 시스템에서 실행됩니다. 쉘에 ADB를 치면 호출되는 프로그램이라고 생각하면 됩니다.
서버
안드로이드 개발 시스템에서의 백그라운드 프로세서 입니다. ADB클라이언트와 ADB데몬(휴대폰) 사이의 통신을 관리합니다.
데몬
에뮬레이터나 스마트폰 장치에서 백그라운드 프로세서로 동작하는 인스턴스입니다.
3.3 중요 명령어
4. APK의 구성 및 디컴파일
4.1 APK
APK 파일은 Android 애플리케이션을 패키징하고 배포하는 데 사용되며, ZIP 아카이브와 매우 유사한 형식을 가지고 있습니다.
ZIP 포멧으로 바꾸고 압축 해제를 시도하면 데이터를 확인할 수 있습니다.
🤪 예시로 한개의 APK 파일의 확장자를 ZIP으로 바꾸어 압축 해제한 결과입니다.
➡️ 그 구성 요소는 다음과 같습니다.
구성요소 | 설명 |
AndroidManifest.xml | 앱의 모든 구성 요소를 설명하는 Android Manifest 파일입니다. 앱의 패키지 이름, 액티비티, 서비스, 사용 권한 등의 정보가 포함되어 있습니다. |
classes.dex | Dalvik 가상 머신에서 실행되는 앱의 바이트 코드가 포함된 dex 파일입니다. 이 파일은 앱의 모든 Java 및 Kotlin 클래스를 포함합니다.
현재(Android 5 이상)는 ART 런타임으로 바뀌었기 때문에 APK 설치 시, 기계어로 변환될 바이트코드 파일이라고 보면 됩니다. |
resources.arsc | 앱에 사용되는 리소스(문자열, 레이아웃, 이미지 등)의 컴파일된 이진 형식 파일입니다 |
res/ | 리소스 디렉토리는 앱에 사용되는 모든 리소스 파일(레이아웃 XML, 문자열, 이미지 등)을 포함합니다. |
assets | 앱에서 사용되는 원시 자원(텍스트 파일, 음악, 비디오 등)을 포함하는 디렉토리입니다. |
META-INF | 앱의 서명 정보와 관련된 파일 이 포함되어 있습니다. 주로 CERT.RSA, CERT.SF 및 MANIFEST.MF 파일이 여기에 포함됩니다. |
4.2 안드로이드 APK 디컴파일(분석) 도구
APK ➡️ JAR
APK 의 dex파일을 JAR파일로 변환할 때 사용됩니다.
- dex2jar
- APK파일이나 APK파일에 포함된 classes.dex 파일을 자바 class 파일로 변환됩니다.
- dex2jar파일을 다운받고
dex2jar.bat <apk이름>
형식으로 사용하면 됩니다.
- jd-gui
- JAR파일을 분석할 수 있는 도구, JAR파일을 올리면 JAVA CODE로 볼 수 있습니다.
bytecode-Viewer
- 변환이 필요 없고, 바이너리 코드와 JAVA 파일 형식의 코드를 모두 보여줍니다.
- JAVA기반으로, JDK가 필요합니다.
리패키징 (APK 파일을 분해하고 다시 조립)
- apktool
smali
코드로 변환하기 위해 사용합니다.
apktool -d <apk>
형식으로 사용 / APK로 빌드하기 위한 명령어는apktool -b <apk>
smali?
- smali는 VM에서 동작하는 바이트코드(dex)를 사람이 읽기 쉬운 상태로 변환합니다.
- smali코드를 수정하고, signing 과정을 통해 재 컴파일하면 apk를 다시 빌드할 수 있습니다.